#ifndef QQ_QUERY
#define QQ_QUERY

#include <qsqldatabase.h>
#include <qsqlquery.h>
#include <qvariant.h>
#include <qmetaobject.h>

#include <QxOrm.h>

class QQQuery :public qx::QxSqlQuery
{
public:
	qx::QxSqlQuery& select(const QString& table, const QStringList& columns = QStringList());

	virtual qx::QxSqlQuery& distinct();

	virtual qx::QxSqlQuery& where(const QString& column);
	virtual qx::QxSqlQuery& where_OpenParenthesis(const QString& column);
	virtual qx::QxSqlQuery& and_(const QString& column);
	virtual qx::QxSqlQuery& and_OpenParenthesis(const QString& column);
	virtual qx::QxSqlQuery& or_(const QString& column);
	virtual qx::QxSqlQuery& or_OpenParenthesis(const QString& column);

	virtual qx::QxSqlQuery& openParenthesis();
	virtual qx::QxSqlQuery& closeParenthesis();

	virtual qx::QxSqlQuery& orderAsc(const QStringList& columns);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2, const QString& col3);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2, const QString& col3, const QString& col4);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7, const QString& col8);
	virtual qx::QxSqlQuery& orderAsc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7, const QString& col8, const QString& col9);

	virtual qx::QxSqlQuery& orderDesc(const QStringList& columns);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2, const QString& col3);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2, const QString& col3, const QString& col4);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7, const QString& col8);
	virtual qx::QxSqlQuery& orderDesc(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7, const QString& col8, const QString& col9);

	virtual qx::QxSqlQuery& groupBy(const QStringList& columns);
	virtual qx::QxSqlQuery& groupBy(const QString& col1);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2, const QString& col3);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2, const QString& col3, const QString& col4);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7, const QString& col8);
	virtual qx::QxSqlQuery& groupBy(const QString& col1, const QString& col2, const QString& col3, const QString& col4, const QString& col5, const QString& col6, const QString& col7, const QString& col8, const QString& col9);

	virtual qx::QxSqlQuery& limit(int rowsCount, int startRow = 0, bool withTies = false);

	virtual qx::QxSqlQuery& like(const QString& val);
	virtual qx::QxSqlQuery& notLike(const QString& val);
	virtual qx::QxSqlQuery& startsWith(const QString& val);
	virtual qx::QxSqlQuery& endsWith(const QString& val);
	virtual qx::QxSqlQuery& containsString(const QString& val);

	virtual qx::QxSqlQuery& isEqualTo(const QVariant& val);
	virtual qx::QxSqlQuery& isNotEqualTo(const QVariant& val);
	virtual qx::QxSqlQuery& isGreaterThan(const QVariant& val);
	virtual qx::QxSqlQuery& isGreaterThanOrEqualTo(const QVariant& val);
	virtual qx::QxSqlQuery& isLessThan(const QVariant& val);
	virtual qx::QxSqlQuery& isLessThanOrEqualTo(const QVariant& val);
	virtual qx::QxSqlQuery& customOperator(const QString& sCustomOperator, const QVariant& val);

	virtual qx::QxSqlQuery& in(const QVariantList& values);
	virtual qx::QxSqlQuery& in(const QVariant& val1);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2, const QVariant& val3);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6, const QVariant& val7);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6, const QVariant& val7, const QVariant& val8);
	virtual qx::QxSqlQuery& in(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6, const QVariant& val7, const QVariant& val8, const QVariant& val9);

	virtual qx::QxSqlQuery& notIn(const QVariantList& values);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2, const QVariant& val3);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6, const QVariant& val7);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6, const QVariant& val7, const QVariant& val8);
	virtual qx::QxSqlQuery& notIn(const QVariant& val1, const QVariant& val2, const QVariant& val3, const QVariant& val4, const QVariant& val5, const QVariant& val6, const QVariant& val7, const QVariant& val8, const QVariant& val9);

	virtual qx::QxSqlQuery& in_Select(const qx::QxSqlQuery& query);
	virtual qx::QxSqlQuery& notIn_Select(const qx::QxSqlQuery& query);
	virtual qx::QxSqlQuery& isEqualTo_Select(const qx::QxSqlQuery& query);
	virtual qx::QxSqlQuery& isNotEqualTo_Select(const qx::QxSqlQuery& query);

	virtual qx::QxSqlQuery& isNull();
	virtual qx::QxSqlQuery& isNotNull();

	virtual qx::QxSqlQuery& isBetween(const QVariant& val1, const QVariant& val2);
	virtual qx::QxSqlQuery& isNotBetween(const QVariant& val1, const QVariant& val2);

	virtual qx::QxSqlQuery& freeText(const QString& text, const QVariantList& values = QVariantList());

	virtual qx::QxSqlQuery& addJoinQuery(const QString& relationKeyOrAlias, const qx::QxSqlQuery& joinQuery);
};

#endif // QQ_QUERY